package cn.thr.ymcc.service.impl;

import cn.thr.ymcc.config.RedisConfig;
import cn.thr.ymcc.result.JsonResult;
import cn.thr.ymcc.service.VerifycodeService;
import cn.thr.ymcc.util.AssertUtil;
import cn.thr.ymcc.util.StrUtils;
import lombok.extern.slf4j.Slf4j;
import org.mockito.internal.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;

@Service
@Slf4j
public class VerifycodeServiceImpl implements VerifycodeService {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    @Override
    public JsonResult sendSmsCode(String phone) {
        //1.手机号不能为空
        AssertUtil.isTrue(StringUtils.hasText(phone),"手机号不能为空");
        //2.手机格式
        Pattern pattern = Pattern.compile("^1[3-9]{1}[0-9]{9}$");
        //3.验证手机格式是否有误
        //.find()方法是部分匹配，是查找输入串中与模式匹配的子串
        //matches()是全部匹配，是将整个输入串与模式匹配，如果要验证一个输入的数据是否为数字类型或其他类型
        AssertUtil.isTrue(pattern.matcher(phone).find(),"手机号码有误");

        //手机号必须是未注册的：openfeign访问用户中心接口，通过手机号查询用户，查不到就表示允许注册

        //4.生成随机验证码
        String code = StrUtils.getRandomString(4);

        //5.判断有没有这个手机号 key
        if(redisTemplate.hasKey(phone)){
            /**
             * 判断用户是不是在1分钟内频繁获取验证码
             *  1）可以用当前系统时间戳 减去 上次获取时间戳，差值判断小于60秒
             *  2）使用剩余过期事件是否大于240秒
             */
            Long expire = redisTemplate.getExpire(phone, TimeUnit.SECONDS);
            //如果不大于240秒   return  JsonResult.error("兄弟你手速太快了！");
            if(expire >240){
                return  JsonResult.error("兄弟你手速太快了！");
            }
            //大于一分钟就把之前的取出来
            code = (String) redisTemplate.opsForValue().get(phone);
        }
        //6.编辑发送信息
        String msg = "你正在注册账户，你的验证码是：" + code;

        //7.因为没有C 发短信的模板就 直接把验证码打印出来
        log.info(msg);
        //8.存入Redis   需要key  redis里面的值  时间300  TimeUnit.SECONDS（秒）
        redisTemplate.opsForValue().set(phone,code,300,TimeUnit.SECONDS);

        return JsonResult.me();
    }
}
